package com.bel.android.dspmanager.preference;
import java.util.Locale;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import com.bel.android.dspmanager.R;
import com.bel.android.dspmanager.service.HeadsetService;
public class EqualizerPreference extends DialogPreference {
protected static final String TAG = EqualizerPreference.class.getSimpleName();
protected EqualizerSurface mListEqualizer, mDialogEqualizer;
private HeadsetService mHeadsetService;
private final ServiceConnection mConnectionForDialog = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
Log.i(TAG, "Acquiring connection to headsetservice");
mHeadsetService = ((HeadsetService.LocalBinder) binder).getService();
updateDspFromDialogEqualizer();
}
@Override
public void onServiceDisconnected(ComponentName name) {
mHeadsetService = null;
}
};
public EqualizerPreference(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
setLayoutResource(R.layout.equalizer);
setDialogLayoutResource(R.layout.equalizer_popup);
}
protected void updateDspFromDialogEqualizer() {
if (mHeadsetService != null) {
float[] levels = new float[6];
for (int i = 0; i < levels.length; i ++) {
levels[i] = mDialogEqualizer.getBand(i);
}
mHeadsetService.setEqualizerLevels(levels);
}
}
private void updateListEqualizerFromValue() {
String value = getPersistedString(null);
if (value != null && mListEqualizer != null) {
String[] levelsStr = value.split(";");
for (int i = 0; i < 6; i ++) {
mListEqualizer.setBand(i, Float.valueOf(levelsStr[i]));
}
}
}
@Override
protected void onBindDialogView(View view) {
super.onBindDialogView(view);
mDialogEqualizer = (EqualizerSurface) view.findViewById(R.id.FrequencyResponse);
mDialogEqualizer.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
float x = event.getX();
float y = event.getY();
/* Which band is closest to the position user pressed? */
int band = mDialogEqualizer.findClosest(x);
int wy = v.getHeight();
float level = (y / wy) * (EqualizerSurface.MIN_DB - EqualizerSurface.MAX_DB)
- EqualizerSurface.MIN_DB;
if (level < EqualizerSurface.MIN_DB) {
level = EqualizerSurface.MIN_DB;
} else if (level > EqualizerSurface.MAX_DB) {
level = EqualizerSurface.MAX_DB;
}
mDialogEqualizer.setBand(band, level);
updateDspFromDialogEqualizer();
return true;
}
});
if (mListEqualizer != null) {
for (int i = 0; i < 6; i ++) {
mDialogEqualizer.setBand(i, mListEqualizer.getBand(i));
}
}
Intent serviceIntent = new Intent(getContext(), HeadsetService.class);
getContext().bindService(serviceIntent, mConnectionForDialog, 0);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
StringBuilder value = new StringBuilder();
for (int i = 0; i < 6; i ++) {
value.append(String.format(Locale.ROOT, "%.1f", mDialogEqualizer.getBand(i)));
value.append(';');
}
persistString(value.toString());
updateListEqualizerFromValue();
}
if (mHeadsetService != null) {
mHeadsetService.setEqualizerLevels(null);
}
getContext().unbindService(mConnectionForDialog);
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
mListEqualizer = (EqualizerSurface) view.findViewById(R.id.FrequencyResponse);
updateListEqualizerFromValue();
}
@Override
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
String value = restorePersistedValue ? getPersistedString(null) : (String) defaultValue;
if (shouldPersist()) {
persistString(value);
}
}
public void refreshFromPreference() {
onSetInitialValue(true, null);
}
}